﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Programa
{
    public class Programa
    {
        private static Dictionary<char, Stack<int>> pilhas;

        public static void Main(string[] args)
        {
            InicializarAmbiente();

            // Push
            PushPilha('a', 10);

            // Soma
            PushPilha('a', TopoPilha('a') - PopPilha('b'));

            // Push em '@'
            PushPilha('@', PopPilha('a'));

            // Loop
            while (!PilhaVazia('@'))
            {
                // Push em 'o'
                PushPilha('o', PopPilha('@'));
            }

            // Push
            PushPilha('a', 20);
            PushPilha('a', 0);
            LimpaPilha('a');

            Imprimir();

            Console.WriteLine("Fim do programa.");
        }

        /* Rotina providas pelo ambiente */

        public static void InicializarAmbiente()
        {
            pilhas = new Dictionary<char, Stack<int>>();

            for (int i = 0; i < 26; i++)
                pilhas.Add((char)('a' + i), new Stack<int>());

            pilhas.Add('@', new Stack<int>());
        }

        public static void PushPilha(char id, int valor)
        {
            if (id == '@')
            {
                foreach (char c in valor.ToString().ToCharArray())
                    pilhas[id].Push(c);
            }
            else
                pilhas[id].Push(valor);
        }

        public static int PopPilha(char id)
        {
            if (PilhaVazia(id))
                return 0;
            else
                return pilhas[id].Pop();
        }

        public static void LimpaPilha(char id)
        {
            if (!PilhaVazia(id) &&
                TopoPilha(id) == 0)
            {
                pilhas[id].Clear();
            }
        }

        public static int TopoPilha(char id)
        {
            if (PilhaVazia(id))
                return 0;
            else
                return pilhas[id].Peek();
        }

        public static bool PilhaVazia(char id)
        {
            return (pilhas[id].Count == 0);
        }

        public static void Imprimir()
        {
            while (!PilhaVazia('o'))
                Console.Write((char)pilhas['o'].Pop());
        }
    }
}
